#include <iostream>
#include <string>
#include <map>

typedef void (*_vfptr)(); // void(*_vfptr)() --> 函数指针 --> 起别名为_vfptr

class Base
{
public:
    virtual void Func1()
    {
        std::cout << "Base::Func1()" << std::endl;
    }
    virtual void Func2()
    {
        std::cout << "Base::Func2()" << std::endl;
    }
    void Func3()
    {
        std::cout << "Base::Func3()" << std::endl;
    }

private:
    int _b = 1;
};
class Derive : public Base
{
public:
    virtual void Func1() override
    {
        std::cout << "Derive::Func1()" << std::endl;
    }
    virtual void Func4()
    {
        std::cout << "Derive::Func4()" << std::endl;
    }

private:
    int _d = 2;
};

void print_virtual_function(_vfptr table[]) // 打印虚函数表 table -> 数组名 -> _vfptr*(类型)
{
    for (int i = 0; table[i] != nullptr; ++i) // Visual studio :虚函数表是以nullptr为结束标记的 / gcc下会SIGSEGV
    {
        printf("[%d]:%p->", i, table[i]);
        _vfptr f = table[i]; // 拿到指针
        f();                 // 调用类中的虚函数
    }
    std::cout << std::endl;
}

int main()
{
    Base b;
    Derive d;
    // 只是支持32位机器下
    //&b -> Base* -> (int*)&b -> 强制转换为int* -> (*(int*)&b) -> 拿到b对象的前四个字节 -> (_vfptr*)(*(int*)&b) -> 强制转换为_vfptr*(函数指针的指针)
    print_virtual_function((_vfptr *)(*(int *)&b));
    print_virtual_function((_vfptr *)(*(int *)&d));
    // 支持32和64位机器下
    print_virtual_function((_vfptr *)(*(long long *)&b));
    print_virtual_function((_vfptr *)(*(long long *)&d));
    // // 支持32和64位机器下
    // //&b -> Base* -> (_vfptr**)&b -> Base*强制转换为_vfptr**(函数指针的指针的指针) -> (*(_vfptr**)&b) -> _vfptr*(函数指针的指针)
    // print_virtual_function((*(_vfptr **)&b));
    // print_virtual_function((*(_vfptr **)&d));
    return 0;
}
